home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Chans / 822-local / parse_hdr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  2.3 KB  |  125 lines

  1. /* parse_hdr: attempt to parse a header file */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Chans/822-local/RCS/parse_hdr.c,v 6.0 1991/12/18 20:04:31 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Chans/822-local/RCS/parse_hdr.c,v 6.0 1991/12/18 20:04:31 jpo Rel $
  9.  *
  10.  * $Log: parse_hdr.c,v $
  11.  * Revision 6.0  1991/12/18  20:04:31  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "util.h"
  19. #include "expand.h"
  20. #include "loc.h"
  21.  
  22. extern void    compress();
  23.  
  24. parse_hdr (fd, vars, maxvp)
  25. int    fd;
  26. Expand    vars[];
  27. int    maxvp;
  28. {
  29.     FILE    *fp;
  30.     Symbol    *sp;
  31.     char    *name, *contents;
  32.     int    vp = 0;
  33.  
  34.     PP_TRACE (("parse_hdr (%d, vars, %d)", fd, maxvp));
  35.  
  36.     fp = fdopen (dup(fd), "r");
  37.  
  38.     while (hdr_read (fp, &name, &contents) == OK) {
  39.         if ((sp = lookup (name)) != NULL && sp -> type == field) {
  40.             if (vp >= maxvp)
  41.                 adios (NULLCP, "More than %s variables!",
  42.                        maxvp);
  43.             if (contents == NULLCP)
  44.                 contents = "";
  45.             if (sp -> str && *sp -> str) {
  46.                 char *cp;
  47.                 int i;
  48.  
  49.                 cp = smalloc (strlen (sp -> str) +
  50.                           strlen (contents) + 2);
  51.                 (void) strcpy (cp, sp -> str);
  52.                 (void) strcat (cp, " ");
  53.                 (void) strcat (cp, contents);
  54.                 free (sp -> str);
  55.                 sp -> str = cp;
  56.                 for (i = 0; i < vp; i++)
  57.                     if (lexequ (vars[i].macro, name) == 0) {
  58.                         vars[i].expansion = sp -> str;
  59.                         break;
  60.                     }
  61.                 if (i >= vp) {
  62.                     vars[vp].macro = strdup (name);
  63.                     vars[vp++].expansion = sp -> str;
  64.                 }
  65.             }
  66.             else {
  67.                 sp -> str = strdup (contents);
  68.                 vars[vp].macro = strdup (name);
  69.                 vars[vp++].expansion = sp -> str;
  70.             }
  71.         }
  72.     }
  73.     fclose (fp);
  74.     return vp;
  75. }
  76.  
  77. hdr_read (fp, np, cp)
  78. FILE    *fp;
  79. char    **np, **cp;
  80. {
  81.     int    c;
  82.     static char    mybuf[8192];
  83.     char *p;
  84.  
  85.     PP_TRACE (("hdr_read (fp, np, cp)"));
  86.  
  87.     *cp = NULLCP;
  88.     *np = mybuf;
  89.  
  90.     for (p = mybuf; (c = getc (fp)) != EOF;) {
  91.         if (c == '\n') {
  92.             if ((c = getc(fp)) == ' ' || c == '\t')
  93.                 continue;
  94.             else {
  95.                 ungetc (c, fp);
  96.                 break;
  97.             }
  98.         }
  99.         else if (c == ':' && *cp == NULLCP) {
  100.             *cp = p + 1;
  101.             *p++ = '\0';
  102.             continue;
  103.         }
  104.         if (p - mybuf < sizeof(mybuf) - 3)
  105.             *p++ = c;
  106.             
  107.     }
  108.     if (c == EOF && p == mybuf)
  109.         return DONE;
  110.     else if (p == mybuf)
  111.         return DONE;
  112.  
  113.     *p = 0;
  114.     compress (mybuf, mybuf);
  115.     if (*cp != NULLCP)
  116.         (void) compress (*cp, *cp);
  117.  
  118.     for (p = *np; *p; p++)
  119.         if (isupper(*p))
  120.             *p = tolower (*p);
  121.  
  122.     PP_TRACE (("hdr_read field=%s contents=%s", *np, *cp));
  123.     return OK;
  124. }
  125.